﻿using Microsoft.Extensions.Logging;
using NPOI.SS.Formula.Functions;
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ITSM
{
    public class ExcelUtil {

        /// <summary>
        /// 将 DataTable 转换为 Excel
        /// 需在 nuget 安装 DotNetCore.NPOI
        /// </summary>
        /// <param name="table">数据表</param>
        /// <param name="sheetName">sheet名称</param>
        /// <returns></returns>
        public byte[] DataTableToExcel(DataTable table, string sheetName = "Sheet")
        {
            try
            {
                IWorkbook workbook = new XSSFWorkbook();
                ISheet sheet = workbook.CreateSheet(sheetName);
                int cellsIndex = 0;
                // 填充表头
                IRow cellsHeader = sheet.CreateRow(cellsIndex);
                for (int i = 0; i < table.Columns.Count; i++)
                {
                    cellsHeader.CreateCell(i).SetCellValue(table.Columns[i].ColumnName);
                }
                // 填充数据
                cellsIndex += 1;
                foreach (DataRow dr in table.Rows)
                {
                    IRow row = sheet.CreateRow(cellsIndex);
                    for (int i = 0; i < table.Columns.Count; i++)
                    {
                        row.CreateCell(i).SetCellValue(Convert.ToString(dr[i]));
                    }
                    cellsIndex++;
                }
#pragma warning disable CS8600 // 将 null 字面量或可能为 null 的值转换为非 null 类型。
                byte[] buffer = null;
#pragma warning restore CS8600 // 将 null 字面量或可能为 null 的值转换为非 null 类型。
                using (MemoryStream ms = new MemoryStream())
                {
                    workbook.Write(ms);
                    buffer = ms.ToArray();
                    ms.Close();
                }
                return buffer;
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
#pragma warning disable CS8603 // 可能返回 null 引用。
                return null;
#pragma warning restore CS8603 // 可能返回 null 引用。
            }
        }

    }
}
